241. MSSQL紀錄log,使用QUERY_STORE

WHY

線上出了問題,
但沒有作Tracer,所以就只能先追Slow Query看看了。

Note

本來以為只能寫Trigger,當觸發動作時,記錄當下的Query
後來問了一下GPT,才發現原來現在的SQL server有一個查詢存放區,
是專門拿來放SQL指令。

查詢存放區會收集 DML 陳述式,例如 SELECTINSERTUPDATEDELETEMERGE 和 BULK INSERT

但這也不是很新的東西,從SQL 2016就有了。
但從SQL 2022開始,這個設定就會預設打開。

開啟方式

ALTER DATABASE <database_name>
SET QUERY_STORE = ON (OPERATION_MODE = READ_WRITE);

然後,就可以查看看所有執行過的SQL了。

SELECT Txt.query_text_id, Txt.query_sql_text, Pln.plan_id, Qry.*, RtSt.*
FROM sys.query_store_plan AS Pln
INNER JOIN sys.query_store_query AS Qry
    ON Pln.query_id = Qry.query_id
INNER JOIN sys.query_store_query_text AS Txt
    ON Qry.query_text_id = Txt.query_text_id
INNER JOIN sys.query_store_runtime_stats RtSt
ON Pln.plan_id = RtSt.plan_id;

計劃存放區中可為查詢儲存的不重複計劃數目,受限於 max_plans_per_query 組態選項。

查詢 max_plans_per_query的值及其他參數

select *
from sys.database_query_store_options

雖然說他的最大值預設是200,
但我實際看起來,我的plan_id已經超過200了還在存。

241-fig.1.png

ref.